﻿using System.Runtime.InteropServices;
using miniQQ_Template.Models;


namespace miniQQ_Template
{
    /// <summary>
    /// TuT 和插件的交互逻辑，相当于控制台中的 Program.cs
    /// </summary>
    public class QQMain
    {
        #region Consts
        /// <summary>插件名</summary>
        internal const string AddOnName = "Template";
        /// <summary>版本</summary>
        internal const string Version = "1.0.0";
        /// <summary>作者</summary>
        internal const string Author = "瑞鸡";        
        /// <summary>描述</summary>
        internal const string Description = "这是一个 C# 语言的 MQ QQ插件SDK模板，请自行修改使用，修改自spin100版本";
        #endregion

        /// <summary>
        /// 插件名字和版本信息，无需在此修改，请看上方注释
        /// </summary>
        /// <returns>版本信息</returns>
        [DllExport(ExportName = nameof(MQinfo), CallingConvention = CallingConvention.StdCall)]
        public static string MQinfo()=> 
            $"插件名称{{{AddOnName}}}" +
            $"插件版本{{{Version}}}" +
            $"插件作者{{{Author}}}" +
            $"插件说明{{{Description}}}" +
            "插件skey{8956RTEWDFG3216598WERDF3}插件sdk{S3}";

        #region 程序分发所有事件，在此调用参数实现各种功能

        /// <summary>
        /// 此子程序会分发机器人 QQ 接收到的所有事件和消息，此函数用于处理 TuT 的任何事件
        /// </summary>
        /// <param name="RobotQQ">机器人 QQ：多 QQ 登录情况下用于识别是哪个 QQ 号</param>
        /// <param name="MsgType">消息类型：信息唯一标识。<para>-1：未定义事件</para><para>1：好友信息</para><para>2：群信息</para><para>3：讨论组信息</para><para>4：群临时会话</para><para>5：讨论组临时会话</para><para>6：在线状态临时会话</para></param>
        /// <param name="MsgCType">消息子类型：对象申请、被邀请入群事件下该值为1时即对象为不良成员</param>
        /// <param name="MsgFrom">消息来源,  信息的源头 可能是群号, 好友QQ, 讨论组ID, 临时会话QQ等</param>
        /// <param name="TigObjF">主动触发者 主动触发这条信息的对象 T人时为T人的管理员QQ</param>
        /// <param name="TigObjC">被触发者, 被动接受这条信息的对象 T人时为被T对象的QQ</param>
        /// <param name="Msg"><para>消息内容, 视情况而定。</para><para>申请入群时为入群理由</para><para>添加好友为附加信息</para><para>T人之类的为空</para></param>
        /// <param name="MsgNum">消息序号：暂定用于消息撤回</param>
        /// <param name="MsgID">消息ID：暂定用于消息撤回</param>
        /// <param name="RawMsg">原始信息：经过解密后的封包字节数据或json结构信息</param>
        /// <param name="pText">信息回传文本指针_Out：信息回传指针。 视情况而定的返回附加文本信息  拒绝好友申请时则为拒绝理由 方式:写到内存("测试",Mini_信息回传文本指针_Out)</param>
        /// <returns>1</returns>
        [DllExport(ExportName = nameof(MQEvent), CallingConvention = CallingConvention.StdCall)]
        public static int MQEvent(string RobotQQ, int MsgType, int MsgCType, string MsgFrom, string TigObjF, string TigObjC, string Msg, string MsgNum, string MsgID, string RawMsg, int pText)
        {
            //note:我觉得 switch 很危险，如果你忘记写 break 了的话，代码会一直执行下去，并且没意识到的话就不好找 BUG
            #region 检验是否满足配置
            //if (!ModelManager.Config.QQRobots.Contains(RobotQQ))
            //{
            //    return 1;
            //}
            //else
            //{
            //    if (MsgType==(int)MsgTypes.MsgType.群)
            //    {
            //        if (!ModelManager.Config.EnabledGroups.Contains(MsgFrom))
            //        {
            //            return 1;
            //        }
            //        if(!ModelManager.Config.OperatorsQQ.Contains(TigObjF))
            //        {
            //            return 1;
            //        }
            //    }
            //}
            #endregion
            if (MsgType == (int)MsgTypes.MsgType.好友)
            {
                //todo 在此解决好友消息
            }
            else if (MsgType == (int)MsgTypes.MsgType.群)
            {
                if (Manager.Config.EnabledGroups.Contains(MsgFrom))
                {
                    //todo 在此解决群聊消息
                }
            }
            if (Msg.Length > 0)
            {
                if (Msg.StartsWith(CommandModel.StartWith))
                {
                    Msg = Msg.Substring(1, Msg.Length - 1);
                    if (Msg.StartsWith(CommandModel.DllName))
                    {
                        Msg = Msg.Replace($"{CommandModel.DllName} ", string.Empty);
                    }
                    foreach (var item in CommandModel.Commands)
                    {
                        if (Msg.StartsWith(item.CommandString))
                        {
                            item.Execute(RobotQQ, MsgType, MsgFrom, TigObjF, Msg);
                        }
                    }
                }
            }
            return 1;
        }
        #endregion

        #region 启动窗体设置配置
        [DllExport(ExportName = nameof(MQset), CallingConvention = CallingConvention.StdCall)]
        ///启动窗体
        public static void MQset()
        {
            FormMain fm = new FormMain();
            fm.Show();
        }
        #endregion

        #region 插件关闭销毁事件
        [DllExport(ExportName = nameof(MQend), CallingConvention = CallingConvention.StdCall)]
        //插件即将被销毁
        public static int MQend()
        {

            return 0;
        }
        #endregion

    }
}
